home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
ada
/
gwuada_6.zip
/
FIND.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-05
|
8KB
|
273 lines
/*
GWAda Development Environment for 386/486 PCs
Copyright (C) 1993, Arthur Vargas Lopes & Michael Bliss Feldman
vlopes@vortex.ufrgs.br mfeldman@seas.gwu.edu
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* find.c */
#include <externs.h>
void AVL_PROCESS_FIND()
{
AVL_FIND(1,"");
}
void AVL_PROCESS_REPLACE()
{
AVL_REPLACE(1);
}
void AVL_FIND(int no,char *what)
{
char f[AVL_MAX_LINEL+10];
AVL_EDIT_WINDOW_PTR w;
AVL_LINE_PTR temp, head = NULL;
struct rccoord old;
AVL_WIN_PTR m1 = NULL, m2;
int n1, n2, x, i, j, k, l, rp;
static char *msg = " GWAda - Find? ";
char msg2[80];
w = &avl_windows[avl_window];
old = _gettextposition();
n1 = 62;
n2 = (80 - n1) / 2;
if (strlen(what) == 0) {
m1 = AVL_MAKE_WINDOW(msg,7,n2,9,n1+n2,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,1);
rp = AVL_PROMPT(1,1,avl_find_txt,60);
if (rp) {
AVL_DEL_WINDOW(m1);
return;
}
}
else
strcpy(avl_find_txt,what);
temp = w -> current_line;
i = w -> txt_col;
while (temp != w -> head) {
x = strlen(temp -> line) - (l = strlen(avl_find_txt));
for(j = i; j < x; ++j) {
for(k = 0; k < l; ++k)
if (toupper(avl_find_txt[k]) != toupper(temp -> line[j + k]))
break;
if (k == l) { /* Found string here */
w -> txt_col = j;
w -> current_line = temp;
if (strlen(what))
if (strcmp(what,"$")) {
w -> current_line = w -> current_line -> previous;
w -> current_line = w -> current_line -> previous;
}
w -> scr_row = 1;
AVL_DEL_WINDOW(m1);
_settextposition(1,1);
AVL_UPDATE_SCREEN();
return;
}
}
temp = temp -> next;
}
if (!strlen(what)) {
sprintf(f,"Can't find: %s",avl_find_txt);
AVL_ERROR(f);
}
AVL_DEL_WINDOW(m1);
}
void AVL_DO_REPLACE(int from, AVL_LINE_PTR w)
{
int i, j, k, n, n2, min;
j = strlen(avl_find_txt);
k = strlen(avl_replace_txt);
n2 = strlen(w -> line);
min = (j > k) ? k : j;
for (i = 0; i < min; ++i)
w -> line[i+from] = avl_replace_txt[i];
if (j == k) return;
if (j > k) { /* Have to compress the line */
n = j - k;
for(i = from + min; i <= (n2 - n); ++i)
w -> line[i] = w -> line[i+n];
}
else { /* Have to insert remaining replacement */
n = k - j;
/* First shift n positions to the right */
for(i = n2 + n; i >= (from + min); --i)
w -> line[i] = w -> line[i-n];
j = min;
for(i = from + min; j < k; ++i)
w -> line[i] = avl_replace_txt[j++];
}
}
void AVL_REPLACE(int no)
{
char f[AVL_MAX_LINEL+10];
char f2[AVL_MAX_LINEL+10];
char f3[AVL_MAX_LINEL+10];
char f3x[AVL_MAX_LINEL+10];
char rmsg[180];
char c;
AVL_EDIT_WINDOW_PTR w;
AVL_LINE_PTR temp, last_change, save_line;
struct rccoord old;
AVL_WIN_PTR m1, m2, hw2;
short n1, n2, x, i, j, k, l, question = 0;
short done = 0, rp, save_txt, save_row, jk;
static char *msg = " GWAda - Replace what? ";
static char *msg2 = " GWAda - Replace by? ";
if (no <= 0) no = 1;
w = &avl_windows[avl_window];
old = _gettextposition();
n1 = 62;
n2 = (80 - n1) / 2;
m1 = AVL_MAKE_WINDOW(msg,6,n2,8,n1+n2,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,1);
rp = AVL_PROMPT(1,1,avl_find_txt,60);
if (avl_find_txt[0] == '\0' || rp) {
AVL_DEL_WINDOW(m1);
_settextposition(old.row,old.col);
return;
}
hw2 = AVL_MAKE_WINDOW(" Examples ",17,39,17+6,39+36,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Enter:\n");
_outtext(" All --- replace all occurences\n");
_outtext(" 3 --- replaces up to 3 times\n");
_outtext(" 3? --- replaces up to 3 times\n");
_outtext(" asking confirmation");
m2 = AVL_MAKE_WINDOW(msg2,10,n2,14,n1+n2,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,1);
rp = AVL_PROMPT(1,1,avl_replace_txt,60);
if (rp) {
AVL_DEL_WINDOW(m2);
AVL_DEL_WINDOW(hw2);
AVL_DEL_WINDOW(m1);
_settextposition(old.row,old.col);
return;
}
_settextposition(3,2);
_outtext("Replace how many times? ");
strcpy(f3,"1");
rp = AVL_PROMPT(3,26,f3,6);
if (rp)
f3[0] = '\0';
else {
strcpy(f3x,f3);
for(i = 0; i < strlen(f3); ++i)
if (f3[i] == '?') {
f3[i] = '\0';
question = 1;
break;
}
}
if ((f3[0] == 'A' || f3[0] == 'a') &&
(f3[1] == 'L' || f3[1] == 'l') &&
(f3[2] == 'L' || f3[2] == 'l') && f3[3] == '\0')
strcpy(f3,"5000");
AVL_DEL_WINDOW(m2);
AVL_DEL_WINDOW(hw2);
AVL_DEL_WINDOW(m1);
no = atoi(f3);
if (f3[0] == '\0' || no == 0) {
_settextposition(old.row,old.col);
return;
}
save_line = w -> current_line;
save_txt = w -> txt_col;
save_row = w -> scr_row;
temp = w -> current_line;
i = w -> txt_col;
while (temp != w -> head) {
x = strlen(temp -> line) - (l = strlen(avl_find_txt));
/* was for(j = i; j < x; ++j) { */
for(j = i; j <= x; ++j) {
for(k = 0; k < l; ++k)
if (toupper(avl_find_txt[k]) != toupper(temp -> line[j + k]))
break;
if (k == l) { /* Found string here */
if (question) {
w -> txt_col = j;
w -> current_line = temp;
w -> scr_row = 1;
AVL_UPDATE_SCREEN();
AVL_UPDATE_CURSOR();
AVL_UPDATE_STATUS_LINE();
for(jk = w -> scr_col; jk < (w -> scr_col + l) && jk < 80 ; ++jk) {
c = *AVL_MAP(2,jk);
AVL_WVIDEO(c,(unsigned char)
((avl_men_bk_color + 16) << 4 | avl_men_letter)
, AVL_MAP(2,jk));
}
_settextposition(1,2);
sprintf(rmsg,"Replace (Y/N) ? ", avl_replace_txt);
m1 = AVL_MAKE_WINDOW(msg,6,n2,8,n1+n2,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,1);
_outtext(avl_find_txt);
m2 = AVL_MAKE_WINDOW(msg2,10,n2,14,n1+n2,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,1);
_outtext(avl_replace_txt);
_settextposition(3,2);
_outtext("Replace how many times? ");
_outtext(f3x);
if (AVL_QUESTION(rmsg) != 'Y') {
AVL_DEL_WINDOW(m2);
AVL_DEL_WINDOW(m1);
continue;
}
AVL_DEL_WINDOW(m2);
AVL_DEL_WINDOW(m1);
}
w -> changed = 1;
AVL_DO_REPLACE(j,temp);
j += (strlen(avl_replace_txt) - 1);
++done;
last_change = temp;
if (--no == 0) goto job_done;
}
}
temp = temp -> next;
i = 0;
}
job_done:
if (question && done) {
w -> current_line = save_line;
w -> txt_col = save_txt;
w -> scr_row = save_row;
}
if (!done) {
sprintf(f,"Can't replace: %s",avl_find_txt);
AVL_ERROR(f);
}
else {
w -> txt_col = j;
w -> current_line = last_change;
w -> scr_row = 1;
_settextposition(old.row,old.col);
AVL_UPDATE_SCREEN();
sprintf(f,"Replaced %s %d time%s",avl_find_txt,done, (done > 1) ? "s" : "");
AVL_TELL(f);
}
_settextposition(old.row,old.col);
}